我們做到了!恭喜所有跟著系列文走到這裡的朋友,也恭喜我自己,完成了這趟為期 30 天的鐵人賽旅程!
今天,是我們系列的最後一天。我們不會再學習新的語法或元件,而是要一起來完成兩件充滿意義的事:
這將是一篇充滿成就感的文章,讓我們開始吧!
這部分是展示最終成果,並盤點在這個專案中學到的關鍵技術。
經過前幾天的努力,我們的 Gemini AI 聊天室 App 已經功能齊全!它能接收使用者輸入、發送網路請求、解析 API 回應,並以動畫流暢地顯示對話。
在這個專案中,我們將過去所學的知識融會貫通,具體應用了以下核心技術:
ChatMessage(Model)、ChatViewController(Controller)和 Xib 檔案(View)各司其職。Codable,建立了 GeminiResponse 等結構體,輕鬆解析了複雜的巢狀 JSON。NetworkManager,學會了如何用 URLSession 發送 POST 請求,並處理非同步回傳的 Result。UITableView 的進階用法,包括使用 insertRows 實現動畫更新,以及透過 UITextViewDelegate 監聽使用者輸入。Info.plist 中,並透過 .gitignore 避免其上傳到公開倉庫,這是邁向專業開發的重要一步。這個專案只是個起點,如果你想繼續挑戰,這裡有幾個很棒的優化方向:
streamGenerateContent,讓 AI 的回覆可以像 ChatGPT 一樣,一個字一個字地「打」出來。MarkdownKit),讓 AI 回傳的程式碼、列表等格式能漂亮地顯示。UserDefaults 或 Core Data,將聊天紀錄儲存在手機本機,讓使用者下次打開 App 時能看到之前的對話。UIAlertController 跳出一個更友善的提示視窗,而不只是 print 在控制台。Cell 作法,讓介面更精美。回想起 Day 1,我們寫下的第一行程式碼 print("Hello, World!"),彷彿還在昨天。而 30 天後的今天,你已經是一位能夠親手打造 AI 聊天 App 的開發者了。
這趟旅程並不容易,但我們一起走過了:
Array、Set、Dictionary 等強大的 集合工具。struct 與 class 之間最重要的 值型別 vs. 參考型別 之戰。IBOutlet 與 IBAction,並攻克了 Auto Layout 這個大魔王。TableView 的進階應用,到 MVC 架構的導入,最終在 Gemini 專案中,將所有知識融會貫通。每一步,都是你努力的證明。
初衷:一場與夥伴的約定,一場對自己的挑戰
當初是與實驗室的夥伴們一同參賽,主要是想挑戰自我。由於過去沒有撰寫過教學文章的經驗,我希望能將自己在學習 Swift 語言過程中遇到的各種問題,以初學者的角度整理與分享,讓讀者能從中獲得實用的知識與啟發。同時,也期盼藉由撰寫與反思的過程,讓自己在 Swift 方面更加精進。
困難與成長:在雕琢文字中,重新認識知識
在撰寫的過程中,我認為最大的挑戰是「文章的修飾」。第一次動筆時,往往只用最直接、簡潔的方式敘述,但後來發現這樣的表達可能會讓讀者難以完全理解。於是我學會重新檢視整篇文章,思考如何將內容結構化、條理化,並以更淺顯的語句讓複雜的觀念變得易懂。這個過程不僅提升了我的表達能力,也讓我更了解「教學」的本質。
最大的收穫,是我在撰寫文章的過程中獲得了實質的成長。過去一些模糊或不熟悉的程式概念,因為需要清楚地寫出來而被迫重新學習與釐清。每完成一篇文章,就像重新整理一次自己的學習脈絡。
最後的感謝:這段旅程,因為有你們而完整
最後,誠摯感謝實驗室的學長姊與夥伴們,一路以來互相提醒、鼓勵與陪伴。即使在連假期間,也會提醒尚未發文的成員不要忘記進度。也感謝 IT 邦幫忙平台提供交流與分享的舞台,讓我能在此成長、被看見。謝謝每一位支持與閱讀的朋友,感謝你們一路的陪伴,我們明年再見!
30 天的鐵人賽即將劃下句點,但你作為一名 iOS 開發者的旅程,現在才正要精彩地開始!
我衷心希望這個系列能為你的 Swift 與 iOS 開發之路,打下一個穩固的基礎。接下來,你可以繼續探索更廣闊的世界,例如:
async/await,優雅地處理非同步任務。Core Data 或 SwiftData,打造能離線使用的 App。學習程式是一場永無止境的冒險,願你保持好奇、享受過程。
感謝大家 30 天的陪伴,我們江湖再見!
我是 Melodia,這是我的第一場 iT 邦幫忙鐵人賽,成功完賽!